Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异 您所在的位置:网站首页 varchar 字符 Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异

#Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异| 来源: 网络整理| 查看: 265

目录

​​1简介... 1​​

​​2 准备... 1​​

​​2.1 环境说明... 1​​

​​3 安装... 2​​

​​4 配置... 2​​

​​5 使用... 3​​

​​5.1 验证实验... 3​​

​​5.2 问题分析... 5​​

​​6 延展... 5​​

​​6.1 varchar2长度与字符集... 5​​

​​6.2 nvarchar2存汉字... 5​​

​​7 总结... 6​​

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下的差异1简介

基于字符集UTF8的mysql数据库下的varchar字段和字符集ZHS16GBK下oracle数据库下同长度的varchar2下的在插入数据时是有差异的,特别是在有中文字段的情况下。具体原因见下文实验以及分析。

2 准备2.1 环境说明

1 mysql版本10.3.13-MariaDB,同理其它mysql版本效果类似。

-- 查看mysql版本SELECT VERSION() AS mysql_Version;

mysql_Version

10.3.13-MariaDB

-- mysql 字符集show variables like '%char%';

Variable_name

Value

character_set_client

utf8

character_set_connection

utf8

character_set_database

utf8

character_set_filesystem

binary

character_set_results

character_set_server

utf8

character_set_system

utf8

character_sets_dir

E:\Program Files\MariaDB 10.3\share\charsets\

2 oracle版本为11g R2,同理其它版本效果类似。

--查看数据库版本SELECT * FROM v$version;

BANNER

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

"CORE   11.2.0.4.0  Production"

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 - Production

--查看字符集SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER

VALUE

NLS_CHARACTERSET

ZHS16GBK

3

无.

4 配置

5 使用5.1 验证实验

1) mysql里创建一个demo表定义id和长度为6的name字段,插入中文数据验证,这里最大的插入长度为6.

CREATE TABLE demo(id int,name varchar(6),PRIMARY KEY (id)) DEFAULT CHARSET=utf8;

注:

如果character_set_database已经是utf8,那么这里建表时可以不加DEFAULT CHARSET=utf8.修改character_set_database参数可以在my.ini或者my.cnf里添加或者修改如下内容:

[client]

default-character-set=utf8

INSERT INTO demo VALUES(10,'中国');INSERT INTO demo VALUES(11,'中国安徽合肥');-- 插入失败 Data too long for column 'name' at row 1INSERT INTO demo VALUES(12,'中国安徽合肥市');INSERT INTO demo VALUES(13,'abcdef');-- 插入失败 Data too long for column 'name' at row 1INSERT INTO demo VALUES(14,'abcdefg');-- 查看字段的字节、字符长度SELECT *,length(name) byte_len,CHAR_LENGTH(name) char_len FROM demo;

附图(插入异常):

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异_oracle字符集

id

name

len

char_len

10

中国

6

2

11

中国安徽合肥

18

6

13

abcdef

6

6

注:

LENGTH(str) :Returns the length of the string str, measured in bytes.以字节为测量单位。   

CHAR_LENGTH(str):Returns the length of the string str, measured in characters. 以字符为测量单位。

2) 同理在oracle里创建一个demo表定义id和长度为6的name字段,插入中文数据验证,这里最大的插入长度为3(基于当前的oracle字符集环境).

SELECT * FROM v$version;

BARNER

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

"CORE  11.2.0.4.0 Production"

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

SELECT * FROM v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER

VALUE

NLS_CHARACTERSET

ZHS16GBu

ID

NAME

BYTE_LEN

CHAR_LEN

10

中国

4

2

11

中国家

6

3

13

abcdef

6

6

5.2 问题分析6 延展6.1 varchar2长度与字符集

varchar2最大是4000字节(byte),查看数据库字符集的方法:

select userenv('language') from dual;

USERENV('LANGUAGE')

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

 

如果是ZHS16GBK即字符集是16位编码的,那么每个字符16位(bit),2字节(byte),所以最大容纳2000个汉字。如果是ZHS32GBK即字符集是32位编码的,那么每个字符32位(bit),4字节(byte),所以最大容纳1000个汉字。如果是字符集是UTF8或者AL32UTF8的,那么每个字符24位(bit),3字节(byte),所以最大容纳4000/3=1333个汉字。SELECT * FROM v$nls_parameters WHERE PARAMETER='NLS_CHARACTERSET';

PARAMETER

VALUE

NLS_CHARACTERSET

UTF8

6.2 nvarchar2存汉字

nvarchar2(6)表示该字段类型为nvarchar2,长度为6,不论英文,数字,中文都能存6个。本文基于字符集ZHS16GBK。

CREATE TABLE demo2(id int,name nvarchar2(6),PRIMARY KEY (id));INSERT INTO demo2 VALUES(10,'中国安徽合肥');---- 插入失败,提示值太大INSERT INTO demo2 VALUES(11,'中国安徽合肥1');INSERT INTO demo2 VALUES(12,'abcdef');---- 插入失败,提示值太大INSERT INTO demo2 VALUES(13,'abcdefg');-- 查看字段的字节、字符长度SELECT A.*,lengthb(name) byte_len,length(name) char_len FROM demo2 A;

 附图(插入异常):

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异_oracle varchar2_02

ID

NAME

BYTE_LEN

CHAR_LEN

10

中国安徽合肥

12

6

12

abcdef

12

6

7 总结

暂无.有问题可以咨询如下:

Mysql UTF8 varchar与Oracle ZHS16GBK varchar2同长度下存汉字的差异_oracle字符集_03



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有